import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import plotly.express as px
from sklearn.preprocessing import LabelEncoder
df=pd.read_csv("H:\VS Code\深圳一手商品房数据处理\更新后的数据集2.0.csv")
df['日期'] = pd.to_datetime(df['日期'])  # 确保日期列为日期类型
df['月份'] = df['日期'].dt.to_period('M')  # 提取月份信息
# 按行政区分组，计算过去1个月的均价（滞后30天）  
df['过去1月均价'] = df.groupby('所属区')['成交均价'].transform(  
    lambda x: x.shift(1).rolling(30, min_periods=1).mean()  )  
df['过去1月均价'] = df['过去1月均价'].fillna(0)  # 将NaN值替换为0
#print(average_price_per_district)  # 输出结果
#print(df.head)#显示前五行，查看数据
#添加成交量变化率（反应市场热度）
df['成交量环比']=df.groupby('所属区')['成交套数'].transform(lambda x:x.pct_change(periods=7))
df['成交量环比'] = df['成交量环比'].fillna(0)  # 将NaN值替换为0
#验证方法
sample_data=df[
    (df['所属区'] == '南山') & (df['月份'] == '2025-02')  # 选择特定行政区和月份
]
print(sample_data[['日期', '成交均价', '过去1月均价', '成交量环比']].head())  # 显示相关数据


#类别特征编码（目的：将文本型分类变量转换为数值特征，适配机器学习模型）
df=pd.get_dummies(df,columns=['用途'],prefix='用途')  # 独热编码               
health_order={'紧缺':0,'健康':1,'过剩':2}
df['健康等级'] = df['健康等级'].map(health_order)  # 映射健康等级为数值型变量
#验证方法
#检查编码后列名与取值
print(df.filter(regex='用途_').columns)  # 显示独热编码后的列名
print(df['健康等级'].value_counts())  # 显示健康等级的取值分布


#布尔特征构造(目的：通过业务规则生成二值特征，增强模型解释性)
#1.特殊时间点标记
#标记是否在周末(假设周末成交量有差异)
df['是否周末']=df['日期'].dt.weekday>=5
#标记是否在节假日（假设节假日为1号和15号）
df['是否节假日']=df['日期'].dt.day.isin([1, 15])
#2.供需状态标记
df['是否紧张区域']=df['健康等级']<1  # 健康等级小于1表示紧张区域
#3.验证方法
print(df[df['是否紧张区域']]['所属区' ].value_counts().reset_index(name='数量'))  # 显示紧张区域的行政区分布

#特征帅选与保存（目的：剔除无效特征，输出最终数据集）
#1.删除冗余字段
df=df.drop(columns=['健康等级'])# 删除原始用途和健康等级列
#2.处理缺失值
df['过去1月均价'] = df['过去1月均价'].fillna(df['成交均价'].mean)  # 将缺失值替换为均值
#3.保存数据集
df.to_csv("H:\VS Code\深圳一手商品房数据处理\特征工程后数据集.csv",index=False)
print(df.head())  # 显示前五行，查看数据